/*******************************************************************

    Author: Xiao
    Date: 2022/3/28 15:07

*******************************************************************/

package dao

import (
	"fmt"
	"mcr/pkg/config"
	"mcr/pkg/logs"
	"time"
)

/**
 * @Description 切换redis数据库
 * @Param 库名
 * @return
 **/
func ChangeDb(num int) {
	Rdb.rdb.Do(Rdb.ctx, "select", num)
}

// 设置token，并设置超时时间
func SetToken(username, token string) error {
	ChangeDb(0)
	err := Rdb.rdb.Set(Rdb.ctx, fmt.Sprintf("token_%s", username), token, time.Duration(config.ConfigValue.JwtExpire)*time.Hour).Err()
	if err != nil {
		return err
	}
	return nil
}

// 设置邮箱验证码，并设置超时时间为10分钟
func SetMailVerify(name, verify string) error {
	ChangeDb(1)
	err := Rdb.rdb.Set(Rdb.ctx, fmt.Sprintf("verify_mail_%s", name), verify, 10*time.Minute).Err()
	if err != nil {
		return err
	}
	return nil
}

// 根据用户名获取token信息
func GetToken(username string) (string, error) {
	ChangeDb(0)
	token, err := Rdb.rdb.Get(Rdb.ctx, fmt.Sprintf("token_%s", username)).Result()
	if err != nil {
		logs.Log.Errorf("从Redis中获取Token失败:%s", err)
		return token, err
	}
	return token, nil
}

// 根据用户名获取邮箱验证码信息
func GetMailVerify(name string) (string, error) {
	ChangeDb(1)
	verify, err := Rdb.rdb.Get(Rdb.ctx, fmt.Sprintf("verify_mail_%s", name)).Result()
	if err != nil {
		//logs.Log.Errorf("从Redis中获取验证码失败:%s",err)
		return verify, err
	}

	return verify, nil
}

// 根据用户名删除邮箱验证码信息
func DelMailVerify(name string) {
	ChangeDb(1)
	Rdb.rdb.Del(Rdb.ctx, fmt.Sprintf("verify_mail_%s", name))
}

// 根据用户名删除token信息
func DelToken(name string) {
	ChangeDb(0)
	Rdb.rdb.Del(Rdb.ctx, fmt.Sprintf("token_%s", name))
}

// 获取服务信息
func GetCacheString(name string) (string, error) {
	ChangeDb(2)
	res, err := Rdb.rdb.Get(Rdb.ctx, name).Result()
	if err != nil {
		return res, err
	}
	return res, nil
}

// 设置服务信息
func SetCacheString(name string, val interface{}, expireTime time.Duration) error {
	ChangeDb(2)
	err := Rdb.rdb.Set(Rdb.ctx, name, val, expireTime).Err()
	return err
}

// 删除服务信息
func DelCacheString(name string) {
	ChangeDb(2)
	Rdb.rdb.Del(Rdb.ctx, name)
}
